home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_13_11
/
phillip2
/
ed.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-14
|
21KB
|
770 lines
/**********************************************
*
* file d:\cips\ed.c
*
* Functions: This file contains
* erosion
* dilation
* mask_erosion
* mask_dilation
* interior_outline
* exterior_outline
* copy_3_x_3
* opening
* closing
* get_shape_options
*
* Purpose:
* These functions perform the erosion,
* dilation, outlining, opening and
* closing operations.
*
* External Calls:
* wtiff.c - round_off_image_size
* create_file_if_needed
* write_array_into_tiff_image
* tiff.c - read_tiff_header
* rtiff.c - read_tiff_image
* numcvrt.c - get_integer
*
* Modifications:
* 14 March 1993 - created
*
************************************************/
#include "cips.h"
short edmask1[3][3] = {{0, 1, 0},
{0, 1, 0},
{0, 1, 0}};
short edmask2[3][3] = {{0, 0, 0},
{1, 1, 1},
{0, 0, 0}};
short edmask3[3][3] = {{0, 1, 0},
{1, 1, 1},
{0, 1, 0}};
short edmask4[3][3] = {{1, 1, 1},
{1, 1, 1},
{1, 1, 1}};
/*******************************************
*
* mask_dilation(...
*
* This function performs the dilation
* operation using the erosion-dilation
* 3x3 masks given above. It works on
* 0-value images.
*
*******************************************/
mask_dilation(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
short mask[3][3], max;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
copy_3_x_3(mask, edmask1);
break;
case 2:
copy_3_x_3(mask, edmask2);
break;
case 3:
copy_3_x_3(mask, edmask3);
break;
case 4:
copy_3_x_3(mask, edmask4);
break;
default:
printf("\nInvalid mask type, using mask 4");
copy_3_x_3(mask, edmask4);
break;
}
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
max = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(mask[a+1][b+1] == 1){
if(the_image[i+a][j+b] > max)
max = the_image[i+a][j+b];
} /* ends if mask == 1 */
} /* ends loop over b */
} /* ends loop over a */
out_image[i][j] = max;
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends mask_dilation */
/*******************************************
*
* mask_erosion(...
*
* This function performs the erosion
* operation using the erosion-dilation
* 3x3 masks given above. It works on
* 0-value images.
*
*******************************************/
mask_erosion(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
short mask[3][3], min;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
copy_3_x_3(mask, edmask1);
break;
case 2:
copy_3_x_3(mask, edmask2);
break;
case 3:
copy_3_x_3(mask, edmask3);
break;
case 4:
copy_3_x_3(mask, edmask4);
break;
default:
printf("\nInvalid mask type, using mask 4");
copy_3_x_3(mask, edmask4);
break;
}
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
min = value;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(mask[a+1][b+1] == 1){
if(the_image[i+a][j+b] < min)
min = the_image[i+a][j+b];
} /* ends if mask == 1 */
} /* ends loop over b */
} /* ends loop over a */
out_image[i][j] = min;
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends mask_erosion */
/*******************************************
*
* erosion(...
*
* This function performs the erosion
* operation. If a value pixel has more
* than the threshold number of 0
* neighbors, you erode it by setting it
* to 0.
*
*******************************************/
erosion(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, threshold)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
threshold, value;
{
int a, b, count, i, j, k;
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
out_image[i][j] = the_image[i][j];
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
if(the_image[i][j] == value){
count = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(the_image[i+a][j+b] == 0)
count++;
} /* ends loop over b */
} /* ends loop over a */
if(count > threshold) out_image[i][j] = 0;
} /* ends if the_image == value */
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends erosion */
/*******************************************
*
* dilation(...
*
* This function performs the dilation
* operation. If a 0 pixel has more than
* threshold number of value neighbors,
* you dilate it by setting it to value.
*
*******************************************/
dilation(in_name, out_name, the_image, out_image,